package com.tz.crm.utils;

import java.util.Calendar;
import java.util.Date;

/**
 * 计算工作天数工具类
 */
public final class DayCalculateUtil {
    /**
     * 私有空参构造
     */
    private DayCalculateUtil() {
    }

    /**
     * 计算同一年内的一段时间内的总天数
     *
     * @param date1 起始时间
     * @param date2 结束时间
     * @return 返回天数
     */
    public static int countDays(Date date1, Date date2) {
        if (date1.getTime() > date2.getTime()) {
            return -1;
        }
        Calendar c1 = toCalendar(date1);
        Calendar c2 = toCalendar(date2);
        int count = 1;
        while (!dayEqual(c1, c2)) {
            c1.add(Calendar.DATE, 1);
            count++;
        }
        return count;
    }

    /**
     * 计算同一年内的一段时间内的工作天数
     *
     * @param date1 起始时间
     * @param date2 结束时间
     * @return 返回工作天数
     */
    public static int countWorkDays(Date date1, Date date2) {
        if (date1.getTime() > date2.getTime()) {
            return -1;
        }
        Calendar c1 = toCalendar(date1);
        Calendar c2 = toCalendar(date2);
        int count = 0;
        if (isWorkDay(c1)) {
            count++;
        }
        while (!dayEqual(c1, c2)) {
            c1.add(Calendar.DATE, 1);
            if (isWorkDay(c1)) {
                count++;
            }
        }
        return count;
    }

    /**
     * 判断该日期是否为工作日
     *
     * @param c Calendar
     * @return 当改日期为星期日 ,或星期六时返回false 否则返回true
     */
    public static boolean isWorkDay(Calendar c) {
        if (c.get(Calendar.DAY_OF_WEEK) == 1 || c.get(Calendar.DAY_OF_WEEK) == 7) {
            return false;
        }
        return true;
    }

    /**
     * 比较两日期否是同一天
     *
     * @param date1 要比较的第一个日期
     * @param date2 要比较的第二个日期
     * @return 当两日期是同一年不一天时返回 true ,否则返回false
     */
    public static boolean dayEqual(Calendar date1, Calendar date2) {
        if (date1.get(Calendar.YEAR) != date2.get(Calendar.YEAR)) {
            return false;
        }
        if (date1.get(Calendar.DAY_OF_YEAR) != date2.get(Calendar.DAY_OF_YEAR)) {
            return false;
        }
        return true;
    }


    /**
     * 将传入的日期转化为毫秒数
     *
     * @param date 要转化的日期
     * @return Calendar
     */
    public static Calendar toCalendar(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(date.getTime());
        return calendar;
    }
}
